package flow

import (
	"fmt"
	"openmanus/agent"

	"openmanus/tool"
	"strings"
)

// BaseFlow 执行流程的基类，支持多个代理
type BaseFlow struct {
	Agents          map[string]agent.IBaseAgent
	Tools           *tool.ToolCollection
	PrimaryAgentKey string
}

// NewFlowAgent 创建工作流智能体
func NewBaseFlow(agents interface{}, tools *tool.ToolCollection) *BaseFlow {
	flow := &BaseFlow{Agents: make(map[string]agent.IBaseAgent), Tools: tools}

	// 处理不同类型的agents输入
	switch a := agents.(type) {
	case agent.IBaseAgent:
		flow.Agents["default"] = a
		flow.PrimaryAgentKey = "default"
	case []agent.IBaseAgent:
		for i, agent := range a {
			key := fmt.Sprintf("agent_%d", i)
			flow.Agents[key] = agent
			// 如果是第一个代理且没有指定primary agent，则设置为primary
			if i == 0 && flow.PrimaryAgentKey == "" {
				flow.PrimaryAgentKey = key
			}
		}
	case map[string]agent.IBaseAgent:
		flow.Agents = a
		// 如果没有指定primary agent，则使用第一个代理
		if flow.PrimaryAgentKey == "" {
			for key := range a {
				flow.PrimaryAgentKey = key
				break
			}
		}
	default:
		panic("unsupported agents type")
	}

	return flow
}

// buildPrompt 定制工作流智能体的 prompt
func (f *BaseFlow) buildPrompt(prompt string) string {
	// 获取可用工具列表
	toolList := f.Tools.GetTools()
	toolDescs := make([]string, 0, len(toolList))
	for name, desc := range toolList {
		toolDescs = append(toolDescs, fmt.Sprintf("- %s: %s", name, desc))
	}

	// 构造工作流风格的 prompt
	return fmt.Sprintf(`你是一个工作流专家。请设计并执行工作流程，协调多个步骤来完成复杂任务。

可用工具：
%s

请按照以下格式输出：
Workflow Design: 设计工作流程
Current Step: 当前执行的步骤
Action: 工具名称
Action Input: {"参数1": "值1", "参数2": "值2"}
Result: 工具执行结果
Next Step: 下一步计划
... (循环直到工作流完成)
Final Answer: 工作流执行总结

用户输入：%s`, strings.Join(toolDescs, "\n"), prompt)
}
